﻿#define _CRT_SECURE_NO_WARNINGS 1
//函数指针变量
//是一个指针变量，指向的是一个函数的地址
//#include<stdio.h>
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int z = Add(a, b);
//	int (*pf)(int,int) = &Add;//int (*pf)(int,int)函数指针变量的定义
//	//int (*)(int, int)就是这个函数指针的类型
//	printf("%d\n",pf(a, b));
//
//	return 0;
//}

//typedef 关键字的使用
//#include<stdio.h>
//
//typedef int* pint;
//typedef int (*pf)(int, int);
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int a = 10;
//
//	int* p1 = &a;
//	pint p2 = &a;
//
//	int (*pAdd)(int, int) = Add;
//	pf padd = Add;
//
//	return 0;
//}

//函数指针数组
//是一个数组，存放的是函数指针
//#include<stdio.h>
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int main()
//{
//	int a = 20;
//	int b = 10;
//	int (*pAdd)(int, int) = Add;
//	int (*pSub)(int, int) = Sub;
//
//	int (*pArr[2])(int, int) = {Add, Sub};//函数指针数组的定义
//
//	printf("%d\n", pArr[0](a, b));//函数指针数组的使用
//
//	return 0;
//}

//函数指针数组的⽤途：转移表
//举例：计算器的⼀般实现

#include<stdio.h>

void menu()
{
	printf("************************\n");
	printf("****  1.Add  2.Sub  ****\n");
	printf("****  3.Mul  4.Div  ****\n");
	printf("******** 0.Exit ********\n");
}

int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

//void test1()
//{
//	int input = 0;
//	do
//	{
//		int x = 0;
//		int y = 0;
//		int num = 0;
//		menu();
//		printf("请选择:>");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("请输入两个操作数:");
//			scanf("%d%d", &x, &y);
//			num = Add(x, y);
//			printf("%d\n", num);
//			break;
//		case 2:
//			printf("请输入两个操作数:");
//			scanf("%d%d", &x, &y);
//			num = Sub(x, y);
//			printf("%d\n", num);
//			break;
//		case 3:
//			printf("请输入两个操作数:");
//			scanf("%d%d", &x, &y);
//			num = Mul(x, y);
//			printf("%d\n", num);
//			break;
//		case 4:
//			printf("请输入两个操作数:");
//			scanf("%d%d", &x, &y);
//			num = Div(x, y);
//			printf("%d\n", num);
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default:
//			printf("输入错误，请重新输入！\n");
//			break;
//		}
//
//	} while (input);
//
//}

//优化
void test2()
{
	int input = 0;
	do
	{
		int x = 0;
		int y = 0;
		int num = 0;
		int (*pArr[])(int, int) = { NULL, Add, Sub, Mul, Div };
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数:");
			scanf("%d%d", &x, &y);
			num = pArr[input](x, y);
			printf("%d\n", num);
		}
		else if(input == 0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("输入错误，请重新输入\n");
		}

	} while (input);

}

int main()
{
	//test1();
	test2();

	return 0;
}